#include "tim3.h"
#include "usart1.h"
#include "dac1.h"
#include "led.h"

/* 以下是一个定时器,到时间将tim2_count + 1 */
// if(IO_RS485_R0T1 == 1){return;}
volatile uint32_t tim3_count = 0;
volatile uint8_t stop_refresh_led_while_usart_send = 1;

/* 每200us就进中断一次，保证文字显示流畅*/
void TIM3_IRQHandler()
{
    // 清除中断标志位
    tim3_inc_and_clear_update_flag();
    // 让发送串口数据时，别在这个中断中占用太多时间，不能及时释放485总线，而错失返回的消息。20250228加入
    if ((IO_RS485_R0T1 == 1) && (stop_refresh_led_while_usart_send == 1))
    {
        return;
    }
    // 更新显示任务,只更新任务，时间短
    led_update_new_task();
    // 有读取音乐的任务，也只更新任务，时间短
    dac1_continue_play_sound();
    // 更新一行，需要点时间将数据同步到屏幕上
    led_one_row_update();
    // 如有需要,读取字体，读字体也需要点时间
    led_read_font_if_nessessary();
}

/* 定时器初始化 */
void TIM3_Init(void)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 时钟使能

    // 定时器TIM3初始化
    TIM_TimeBaseStructure.TIM_Period = US_PER_ROW - 1;                              // 设置在下一个更新事件装入活动的自动重装载寄存器周期的值
    TIM_TimeBaseStructure.TIM_Prescaler = clocks.PCLK1_Frequency * 2 / 1000000 - 1; // 设置用来作为TIMx时钟频率除数的预分频值
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;                         // 设置时钟分割:TDTS = Tck_tim
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down;                   // TIM向上计数模式
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);                                 // 根据指定的参数初始化TIMx的时间基数单位

    TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); // 使能指定的TIM3中断,允许更新中断

    // 中断优先级NVIC设置
    NVIC_SetPriority(TIM3_IRQn, 7); // 最低级优先级
    NVIC_EnableIRQ(TIM3_IRQn);      // 使能中断
    TIM_Cmd(TIM3, ENABLE);          // 使能TIMx
}